package main

import (
	"bufio"
	"fmt"
	"io"
	"strings"
)

//斐波那契数列
// 1, 1, 2, 3, 5, 8, 13, ...
//    a, b
//       a, b
//func fibonacci() func() int {
//	a,b := 0, 1
//	return func() int {
//		a, b = b, a+b
//		return a
//	}
//}

type intGen func() int

//为函数实现接口, 注意intGen是个函数类型，不是struct
//go里，只要是类型都可以实现接口
func (g intGen) Read(p []byte) (n int, err error) {
	next := g()
	if next > 10000 {
		return 0, io.EOF
	}
	s := fmt.Sprintf("%d\n", next)
	// TODO: incorrect if p is too small
	return strings.NewReader(s).Read(p)
}

func fibonacci() intGen {
	a, b := 0, 1
	return func() int {
		a, b = b, a+b
		return a
	}
}

// 使用接口
func printFileContents(reader io.Reader) {
	scanner := bufio.NewScanner(reader)

	//这类似其他语言的while
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}

func main() {
	////斐波那契数列
	//f := fibonacci()
	//fmt.Println(f()) // 1
	//fmt.Println(f()) // 1
	//fmt.Println(f()) // 2
	//fmt.Println(f()) // 3
	//fmt.Println(f()) // 5
	//fmt.Println(f()) // 8
	//fmt.Println(f()) // 13
	//fmt.Println(f()) // 21

	f := fibonacci()
	printFileContents(f)
}
